package messages;

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import db.DBManager;
import db.Message;
import debug.Dbg;

public class UpdateServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		perform(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		perform(req, resp);
	}

	private void perform(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		//	リクエスト情報の文字エンコーディングを指定
		req.setCharacterEncoding("UTF-8");
		//	パラメータを表示（デバッグ）
		Dbg.print(req);
		//	文字列定数
		final String UPDATE_SQL = 
				"update messages set message = ?,delete_flag = ? "
				+ "where id = ?";
		final String SQL = 	"select * from messages where id = ?";
		//	パラメータを取得
		String strId 			= req.getParameter("id");					//	id
		String password 	= req.getParameter("password");		//	パスワード
		String message 		= req.getParameter("message");		//	メッセージ
		String delete_flag 	= req.getParameter("delete_flag");	//	削除フラグ
		int id = 0;
		Message obj = null;
		
		StringBuffer msg = new StringBuffer();							//	エラーメッセージを空で準備
		//	パラメータをチェックする
		if (strId == null || strId.length() == 0) {
			msg.append("エラーが発生しました<br />");
		}
		else {
			try {
				id = Integer.parseInt(strId);
			}
			catch (NumberFormatException e) {
				msg.append("エラーが発生しました<br />");
			}
		}
		if (message == null || message.length() == 0) {
			msg.append("メッセージを入力してください<br />");
		}
//		if (password == null || password.length() == 0) {
//			msg.append("パスワードを入力してください<br />");
//		}
		delete_flag = (delete_flag == null) ? "0" : "1";
		//	パラメータが正常な場合、レコードを更新する
		if (msg.length() == 0) {
			try {
				Connection con = DBManager.getConnection();		//	DB接続

				PreparedStatement pss = con.prepareStatement(SQL);
				pss.setInt(1, id);
				ResultSet rs = pss.executeQuery();						//	レコードを検索する
				if (rs.next()) {
					obj = new Message( rs );
				}
				rs.close();
				pss.close();															//	後処理
				
				if (password != null && 
						password.equals(obj.getPassword())) {
					//	SQL準備
					PreparedStatement ps = con.prepareStatement(UPDATE_SQL);
					ps.setString(1, message);
					ps.setString(2, delete_flag);
					ps.setInt(3, id);
					ps.executeUpdate();												//	データを登録する
					
					ps.close();																//	後処理
				}
				con.close();
			}
			catch (SQLException e) {
				e.printStackTrace();
				msg.append("データベース関連の例外が発生しました");
			}
		}
		//	入力漏れなどの場合、入力画面へ遷移する
		if (msg.length() > 0) {
			req.setAttribute("msg", msg.toString());
			req.setAttribute("message", obj);

			RequestDispatcher d =
					req.getRequestDispatcher("edit.jsp");
			d.forward(req, resp);
		}
		//	正常に更新できた場合、一覧画面へ遷移する
		else {
			resp.sendRedirect("ListServlet");
		}
	}
}
